package com.iyue.util;

import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import com.iyue.common.base.AbstractBaseText;

/**
 * 《IP地址认证》实用类
 * 
 * @author 孙晓晔
 * @version $Id: IpSafe.java,v 1.3 2010/12/20 10:45:26 fresh Exp $
 */
public final class IpSafe {
	public static HashMap<String, Integer> gateway = new HashMap<String, Integer>();

	/**
	 * IP安全检测
	 * 
	 * @param request
	 * @return
	 */
	public static boolean ipsafe(HttpServletRequest request) {
		String ip = getIp(request);
		/**
		 * 移动IP
		 */
		if (isChinaMobile(ip)) {
			return true;
		}
		/**
		 * 可信赖IP
		 */
		if (isTrust(ip)) {
			return true;
		}

		return false;
	}

	/**
	 * 验证请求来源是否是内部IP
	 * 
	 * @param request
	 * @return
	 */
	public static boolean isIntranetIp(HttpServletRequest request) {
		String ip = getIp(request);

		if (IpAddr.contains("10.28.0.0/16", ip)) {
			return true;
		}
		if (IpAddr.contains("192.168.0.0/16", ip)) {
			return true;
		}
		if (IpAddr.contains("127.0.0.0/21", ip)) {
			return true;
		}

		return false;
	}

	/**
	 * 同步接口IP检测
	 * 
	 * @param ip
	 * @param ua
	 * @return
	 */
	public static boolean sync_ip(HttpServletRequest request) {
		String ip = getIp(request);
		/**
		 * 内网IP
		 */
		if (IpAddr.contains("10.28.0.0/16", ip)) {
			return true;
		}
		if (IpAddr.contains("192.168.0.0/16", ip)) {
			return true;
		}
		if (IpAddr.contains("127.0.0.0/21", ip)) {
			return true;
		}

		return false;
	}

	/**
	 * 可信任的IP
	 * 
	 * @param ip
	 * @return
	 */
	public static boolean isTrust(String ip) {
		/**
		 * 内网
		 */
		if (IpAddr.contains("10.28.0.0/16", ip)) {
			return true;
		}
		if (IpAddr.contains("192.168.0.0/16", ip)) {
			return true;
		}
		if (IpAddr.contains("127.0.0.0/21", ip)) {
			return true;
		}

		return false;
	}

	public static boolean isChinaMobile(String ip) {
		// 第一期
		if (IpAddr.between("211.103.0.0~211.103.127.255", ip)) {
			return true;
		}
		if (IpAddr.between("211.136.0.0~211.141.255.255", ip)) {
			return true;
		}
		// 第二期
		if (IpAddr.between("211.142.0.0~211.143.255.255", ip)) {
			return true;
		}
		if (IpAddr.between("218.200.0.0~218.205.255.255", ip)) {
			return true;
		}
		// 第三期
		if (IpAddr.between("218.206.0.0~218.207.255.255", ip)) {
			return true;
		}
		if (IpAddr.between("221.130.0.0~221.131.255.255", ip)) {
			return true;
		}
		if (IpAddr.between("221.176.0.0~221.183.255.255", ip)) {
			return true;
		}
		// 第四期
		if (IpAddr.between("117.128.0.0~117.191.255.255", ip)) {
			return true;
		}
		// 第五期
		if (IpAddr.between("120.192.0.0~120.255.255.255", ip)) {
			return true;
		}
		// 第六期
		if (IpAddr.between("112.0.0.0~112.63.255.255", ip)) {
			return true;
		}
		// 第七期
		if (IpAddr.between("111.0.0.0~111.63.255.255", ip)) {
			return true;
		}

		return false;
	}

	/**
	 * 是否来自类合法网关，如类WAP网关、发博客、上传头像等
	 * 
	 * @param ip
	 * @param ua
	 * @return
	 */
	public static boolean isGateway(HttpServletRequest request) {
		String ip = getIp(request);
		String ua = request.getHeader("User-Agent");

		if (ua == null || ua.isEmpty()) {
			return false;
		}

		if (!ua.startsWith("test")) {
			return false;
		}

		if (IpAddr.contains("211.99.191.[35-39]", ip)) {
			return true;
		}

		if (IpAddr.contains("221.179.6.1/24", ip)) {
			return true;
		}

		if (IpAddr.contains("192.168.20.1/24", ip)) {
			return true;
		}

		if (IpAddr.contains("218.241.167.178/24", ip)) {
			return true;
		}

		return false;
	}

	public static Integer text_src(HttpServletRequest request) {
		String ua = request.getHeader("User-Agent");
		if (ua == null || ua.equals("")) {
			return AbstractBaseText.SRC_WAP;
		}

		String ip = getIp(request);
		if (IpAddr.contains("218.200.244.69/13", ip)) {
			return AbstractBaseText.SRC_WAP;
		}

		if (IpAddr.contains("211.136.192.44/13", ip)) {
			return AbstractBaseText.SRC_WAP;
		}

		if (IpAddr.contains("221.130.33.[35-40]", ip)) {
			return AbstractBaseText.SRC_WAP;
		}

		if (IpAddr.contains("211.99.191.36/24", ip)) {
			return AbstractBaseText.SRC_WAP;
		}

		if (IpAddr.contains("192.168.20.1/24", ip)) {
			return AbstractBaseText.SRC_SMS;
		}

		return AbstractBaseText.SRC_PC;
	}

	public static boolean isLocal(String ip) {
		if (ip == null) {
			return false;
		}

		if (ip.startsWith("127.0.0")) {
			return true;
		}

		if (ip.startsWith("192.168")) {
			return true;
		}

		if (ip.startsWith("10.28.1")) {
			return true;
		}

		return false;
	}

	public static String getIp(HttpServletRequest request) {
		String ip = request.getRemoteAddr();
		String result = request.getHeader("X-Real-IP");
		if (result != null && isLocal(ip)) {
			ip = result;
		}
		return ip;
	}

	/**
	 * 判断是否是安全的IP来源
	 * 
	 * @param request
	 * @return
	 */
	public static boolean isSafeIp(HttpServletRequest request) {
		String ip = getIp(request);
		/**
		 * 可信赖IP
		 */
		if (isTrust(ip)) {
			return true;
		}

		return false;
	}
}
